import cv2
img_path="buttons.png"
src=cv2.imread(img_path)    #读取图像
cv2.imshow("Input",src)     #显示原图像
oriImg=cv2.GaussianBlur(src,(5,5),0)    #高斯滤波
#将图像的色彩空间从BGR转换为GRAY
img=cv2.cvtColor(oriImg,cv2.COLOR_BGR2GRAY)
#二值化阈值处理
ret,img=cv2.threshold(img,250,255,cv2.THRESH_BINARY_INV)
cv2.imshow("MASK",img)      #显示二值化阈值处理后的图像

#创建结构元素
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
img=cv2.dilate(img,kernel,iterations=1)     #进行膨胀运算
img=cv2.erode(img,kernel,iterations=1)      #进行腐蚀运算
cv2.imshow("Morphology",img)        #显示膨胀和腐蚀运算后的图像
#进行形态学梯度运算
edges=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
cv2.imshow("Edges",edges)       #显示形态学梯度运算后的图像

#查找轮廓
contours,hierarchy=cv2.findContours(edges,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
#筛选轮廓
for contour in contours:
    x,y,w,h=cv2.boundingRect(contour)
    #对长宽比进行限制，以确定图形是否为圆形或者类圆形
    if w/h>0.7 and w/h<1.3:
        #在原图像上绘制矩形框
        cv2.rectangle(src,(x,y),(x+w,y+h),(0,0,255))
cv2.imshow("Image",src) #显示带矩形框的图像
num_buttons=len(contours)       #通过矩形框的数量来统计纽扣的数量
print(f'检测到图像中纽扣的数量：{num_buttons}')
cv2.waitKey()
cv2.destroyAllWindows()
